package cn.com.dashihui.kit;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import com.google.common.util.concurrent.ThreadFactoryBuilder;

/**
 * 线程池
 * 
 * @author szq Date: 2018年7月21日 上午11:23:58
 */
public class ThreadPoolKit {

	/*
	 * 团购线程池工厂
	 */
	private static ThreadFactory teamThreadFactory = new ThreadFactoryBuilder()
			.setNameFormat("MIT-theAsync-TeamInTeam")
			.build();
	/* 
	 * 团购结束逻辑定时器 
	 */
	private static ThreadFactory teamOverThreadFactory = new ThreadFactoryBuilder()
			.setNameFormat("MIT-theAsync-teamOverTask")
			.build();
	/*
	 * 定时任务，每分钟非人为取消过期订单
	 */
	private static ThreadFactory expireOrderThreadFactory = new ThreadFactoryBuilder()
			.setNameFormat("MIT-theAsync-expireOrderTask")
			.build();
	/*
	 * 开启线程等待
	 */
	private static ThreadFactory rabbitMQThreadFactory = new ThreadFactoryBuilder()
			.setNameFormat("MIT-theAsync-rabbitMQTask")
			.build();
	/**
	 * 团购线程池
	 * corePoolSize: 线程池维护线程的最少线程数,也是核心线程数,包括空闲线程 
	 * maximumPoolSize: 线程池维护线程的最大线程数
	 * keepAliveTime: 线程池维护线程所允许的空闲时间 
	 * unit: 程池维护线程所允许的空闲时间的单位 
	 * workQueue: 线程池所使用的缓冲队列
	 * handler: 线程池对拒绝任务的处理策略 当一个任务通过
	 * execute(Runnable)方法欲添加到线程池时： 
	 * 1、如果此时线程池中的数量小于corePoolSize，即使线程池中的线程都处于空闲状态，也要创建新的线程来处理被添加的任务。
	 * 2、如果此时线程池中的数量等于 corePoolSize，但是缓冲队列 workQueue未满，那么任务被放入缓冲队列。 
	 * 3、如果此时线程池中的数量大于corePoolSize，缓冲队列workQueue满，并且线程池中的数量小于maximumPoolSize，建新的线程来处理被添加的任务。
	 * 4、 如果此时线程池中的数量大于corePoolSize，缓冲队列workQueue满，并且线程池中的数量等于maximumPoolSize，那么通过
	 *    handler所指定的策略来处理此任务。也就是：处理任务的优先级为：核心线程corePoolSize、任务队列workQueue、最大线程
	 *    maximumPoolSize，如果三者都满了，使用handler处理被拒绝的任务。
	 * 5、 当线程池中的线程数量大于corePoolSize时，如果某线程空闲时间超过keepAliveTime，线程将被终止。这样，线程池可以动态的调整池中的线程数。
	 */
	public static ThreadPoolExecutor teamThreadPool = new ThreadPoolExecutor(10, 100, 60, 
											               TimeUnit.SECONDS,
											               new ArrayBlockingQueue<Runnable>(800), 
											               teamThreadFactory,
											               new ThreadPoolExecutor.CallerRunsPolicy());
	/*
	 * 无需签收物流
	 */
	public static ThreadPoolExecutor teamOverThreadPool = new ThreadPoolExecutor(3, 6, 60, 
												            TimeUnit.SECONDS,
												            new ArrayBlockingQueue<Runnable>(100), 
												            teamOverThreadFactory,
												            new ThreadPoolExecutor.CallerRunsPolicy());
	
	/*
	 * 由于过期订单每分钟查询，需要查询多种且耗时，所以需要用线程去异步执行 
	 */
	public static ThreadPoolExecutor expireOrderThreadPool = new ThreadPoolExecutor(3, 6, 60, 
												            TimeUnit.SECONDS,
												            new ArrayBlockingQueue<Runnable>(10), 
												            expireOrderThreadFactory,
												            new ThreadPoolExecutor.CallerRunsPolicy());
	/*
	 * rabbitMQ等待消息通知
	 */
	public static ThreadPoolExecutor rabbitMQThreadPool = new ThreadPoolExecutor(3, 4, 60, 
            TimeUnit.SECONDS,
            new ArrayBlockingQueue<Runnable>(10), 
            rabbitMQThreadFactory,
            new ThreadPoolExecutor.CallerRunsPolicy());

}
